using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using SubsidiosBussinessLogic.DataAccess.Context;
using SubsidiosBussinessLogic.DataAccess.Interfaces;
using SubsidiosBussinessLogic.DataAccess.SqlServerRepository;
using SubsidiosBussinessLogic.SubsidioExceptions;
using SubsidiosWebMvc.CommonData;
using SubsidiosWebMvc.Models;

namespace SubsidiosWebMvc.Controllers
{
    public class FuncionarioController : Controller
    {
        
        //
        // GET: /Funcionario/

        private IFuncionarioRepository Repository { get; set; }
        
        #region .ctor
        public FuncionarioController() : this (new FuncionarioRepository(DataContextFactory.GetContext()))
        {}

        public FuncionarioController(IFuncionarioRepository repository)
        {
            Repository = repository;
        }
        #endregion


        public ActionResult Listar()
        {
            var funcionarios = Repository.GetFuncionarios();
            return View("Listar", funcionarios);
        }

        //
        // GET: /Funcionario/Details/5

        public ActionResult Detalles(int id)
        {
            var funcionario = Repository.FindSingle(f => f.FuncionarioId == id);

            return View("Detalles", new FuncionarioFormViewModel(funcionario));
        }

        //
        // GET: /Funcionario/Create

        public ActionResult Crear()
        {
            var funcionario = Repository.CreateFuncionario();
            return View("Crear", new FuncionarioFormViewModel(funcionario));
        } 

        //
        // POST: /Funcionario/Create

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Crear(FormCollection collection)
        {
            var funcionario = Repository.CreateFuncionario();
            try
            {
                // TODO: Add insert logic here
                UpdateModel(funcionario);
                UpdateModel(funcionario.Ente);

                Repository.SaveFuncionario();
                return RedirectToAction("Detalles", new{Id = funcionario.FuncionarioId});
            }
            catch
            {
                return View(funcionario);
            }
        }

        //
        // GET: /Funcionario/Edit/5
 
        public ActionResult Editar(int id)
        {
            var funcionario = Repository.FindSingle(f => f.FuncionarioId == id);
            return View("Editar", new FuncionarioFormViewModel(funcionario));
        }

        //
        // POST: /Funcionario/Edit/5

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Editar(int id, FormCollection collection)
        {
            var funcionario = Repository.FindSingle(f => f.FuncionarioId == id);
            try
            {
                // TODO: Add update logic here
                UpdateModel(funcionario);
                UpdateModel(funcionario.Ente);
                Repository.SaveFuncionario();
                return RedirectToAction("Detalles", new{id= funcionario.FuncionarioId});
            }
            catch
            {
                return View(funcionario);
            }
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult GridataSave(int id)
        {
            var funcionario = Repository.FindSingle(f => f.FuncionarioId == id);
            try
            {
                // TODO: Add update logic here
                UpdateModel(funcionario);
                UpdateModel(funcionario.Ente);
                Repository.SaveFuncionario();
                return null;
            }
            catch (SubsidiosExceptions invalidOperationException)
            {
                return Content(invalidOperationException.Message);
            }
            catch (Exception)
            {
                return Content("Ocurrio un error al guardar");
            }
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult GridataAdd()
        {
            var funcionario = Repository.CreateFuncionario();
            try
            {
                UpdateModel(funcionario);
                UpdateModel(funcionario.Ente);
                Repository.SaveFuncionario();
                return null;
            }
            catch (SubsidiosExceptions invalidOperationException)
            {
                return Content(invalidOperationException.Message);
            }
            catch (Exception)
            {
                return Content("Ocurrio un error al insertar");
            }

        }

        public ActionResult GridData(string sidx, string sord, int page, int rows, bool _search, string searchField, string searchOper, string searchString)
        {
            var funcionarios = Repository.GetFuncionarios();
            var jsonData = new JsonData { page = page, records = 3, rows = new List<Rows>() };
            var pageIndex = page - 1;
            jsonData.page = page;
            jsonData.records = funcionarios.Count();
            jsonData.total = (int)Math.Ceiling((float)jsonData.records / (float)rows);
            jsonData.rows = new List<Rows>();

            foreach (var funcionario in funcionarios)
            {

                jsonData.rows.Add(new Rows { id = funcionario.FuncionarioId, cell = new string[] { funcionario.FuncionarioId.ToString(), funcionario.Bloque.Descripcion,funcionario.TipoFuncionario.Descripcion,funcionario.Ente.RazonSocial } });

            }

            return Json(jsonData);

        }
        public ActionResult GetFuncionarios()
        {
            var funcionarios = Repository.GetFuncionarios();
            string result = "";
            foreach (var funcionario in funcionarios)
            {
                result += String.Format("{0}:{1};", funcionario.FuncionarioId, funcionario.Ente.RazonSocial);
            }

            return Content(result.TrimEnd(new char[] { ';' }));
        }
    }
}
